연산자 오버로딩
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
연산자 오버로딩은 프로그래밍 언어에서 연산자의 기능을 사용자가 정의한 자료형에 맞게 재정의하는 기능이다. ALGOL 68에서 처음 도입되었으며, C++, 에이다, 파이썬, 루비, C# 등 다양한 언어에서 지원된다. 연산자 오버로딩은 구문 설탕으로, 수학적 표기법을 프로그래밍에 적용하여 코드의 가독성을 높이는 데 기여한다. 하지만, 교환 법칙이나 결합 법칙이 성립하지 않는 경우도 있어 주의가 필요하다. 지원 여부는 언어별로 다르며, 연산자 신규 정의 가능 여부, 연산자 종류 제한, 다중 정의 가능 여부 등으로 분류할 수 있다.
더 읽어볼만한 페이지
- 연산자 (프로그래밍) - 중위 표기법
중위 표기법은 사람이 이해하기 쉬운 연산자 표기 방식이지만, 컴퓨터가 구문 분석하기 어렵고 연산 순서를 위해 괄호나 연산자 우선순위 규칙이 필요하다. - 연산자 (프로그래밍) - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다. - 프로그래밍 구성체 - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다. - 프로그래밍 구성체 - 일급 객체
일급 객체는 프로그래밍 언어에서 객체를 다루는 방식에 대한 개념으로, 함수의 매개변수, 반환 값, 할당, 동일 비교의 대상이 될 수 있으며 정수, 함수 등 다양한 형태로 나타난다.
연산자 오버로딩 | |
---|---|
연산자 오버로딩 | |
정의 | 연산자 오버로딩(operator overloading)은 프로그래밍 언어의 기능 중 하나이며, 사용자가 정의한 데이터 타입에 대해 내장 연산자(예: +, -, *, /)의 의미를 재정의하는 것을 말함. |
목적 | 연산자 오버로딩의 목적은 사용자가 정의한 데이터 타입에 대해 연산자를 더 직관적이고 자연스럽게 사용할 수 있도록 하는 것임. |
특징 | C++, C#, 스칼라, 파이썬, 루비, 펄, 오캄, 하스켈, 델파이, 에펠 등의 프로그래밍 언어에서 지원함. 모든 연산자를 오버로딩할 수 있는 것은 아니며, 언어에 따라 오버로딩 가능 여부가 다름. 연산자 오버로딩은 코드의 가독성을 높일 수 있지만, 남용할 경우 오히려 가독성을 떨어뜨리고 오류 발생 가능성을 높일 수 있음. |
예시 | |
C++ | C++에서 연산자 오버로딩은 operator 키워드를 사용하여 정의함. 예를 들어, + 연산자를 오버로딩하려면 operator+() 함수를 정의해야 함. |
파이썬 | 파이썬에서는 연산자 오버로딩을 위해 특별한 메소드 이름(예: __add__, __sub__)을 사용함. |
장점 | |
가독성 향상 | 연산자를 사용하여 코드를 더 직관적으로 표현할 수 있음. |
코드 재사용성 증가 | 사용자 정의 타입에 대한 연산을 일반적인 연산자처럼 사용할 수 있어 코드 재사용성이 높아짐. |
단점 | |
가독성 저하 | 연산자 오버로딩을 남용하면 코드의 의미를 파악하기 어려워질 수 있음. |
오류 발생 가능성 증가 | 예상치 못한 동작을 유발하여 디버깅이 어려워질 수 있음. |
주의사항 | |
남용 금지 | 연산자 오버로딩은 필요한 경우에만 신중하게 사용해야 함. |
의미 명확성 유지 | 연산자의 원래 의미와 유사하게 오버로딩하여 혼란을 방지해야 함. |
2. 역사
연산자 오버로딩은 1960년대 ALGOL 68에서 처음 도입되었다.[61] FORTRAN에서 처음 도입되어 여러 언어에 채택되었으며, 객체 지향 프로그래밍의 발달과 함께 다형성을 구현하는 중요한 기능으로 자리 잡았다. 사용자 정의 연산자는 함수, 멤버 함수 또는 메서드 중 하나로 정의된다.
2. 1. 1960년대
ALGOL 68은 연산자 오버로딩을 허용했다.[61] 특별한 선언 없이 연산자를 오버로드할 수 있었고, 프로그래머는 새로운 연산자를 자유롭게 만들 수 있었다.[43]ALGOL 68 언어 명세서(177페이지)에서 발췌한 ¬, =, ≠, 그리고 '''abs''' 연산자의 오버로딩 정의는 다음과 같다.
10.2.2. 부울 피연산자에 대한 연산
a) '''op''' ∨ = ('''bool''' a, b) '''bool''':( a | '''true''' | b );
b) '''op''' ∧ = ('''bool''' a, b) '''bool''': ( a | b | '''false''' );
c) '''op''' ¬ = ('''bool''' a) '''bool''': ( a | '''false''' | '''true''' );
d) '''op''' = = ('''bool''' a, b) '''bool''':( a∧b ) ∨ ( ¬b∧¬a );
e) '''op''' ≠ = ('''bool''' a, b) '''bool''': ¬(a=b);
f) '''op''' '''abs''' = ('''bool''' a)'''int''': ( a | 1 | 0 );
이항 연산자의 경우 다른 연산자에 대한 우선순위를 설정할 수 있다. 예시는 다음과 같다.
'''prio''' '''max''' = 9;
'''op''' '''max''' = ('''int''' a, b) '''int''': ( a>b | a | b );
'''op''' '''++''' = ( '''ref''' '''int''' a ) '''int''': ( a +:= 1 );
2. 2. 1980년대
에이다는 1983년 에이다 83 언어 표준이 발표되면서부터 연산자 오버로딩을 지원했다. 하지만 언어 설계자들은 새로운 연산자 정의는 허용하지 않기로 결정했다. 언어 내에 이미 존재하는 연산자들(+, *, and 등)에 새로운 함수를 정의하여 오버로딩하는 것만 가능했다. 이후 1995년과 2005년에 이루어진 언어 개정에서도 기존 연산자의 오버로딩에 대한 제한은 유지되었다.[62]C++의 연산자 오버로딩은 ALGOL 68보다 더 정교하게 구현되었다.[44]
2. 3. 1990년대
썬 마이크로시스템즈는 자바 언어 설계에서 연산자 오버로딩을 포함하지 않기로 결정했다.[63][64][45][46][47]파이썬은 특수 이름을 가진 메서드를 구현하여 연산자 오버로딩을 허용한다.[48] 예를 들어, 덧셈(+) 연산자는 `obj.__add__(self, other)` 메서드를 구현하여 오버로딩할 수 있다.
루비와 Lua는 메서드 호출을 위한 구문 설탕으로서 연산자 오버로딩을 허용한다. Lua는 첫 번째 피연산자가 해당 연산자를 정의하지 않으면 두 번째 피연산자의 메서드가 사용된다는 추가 기능을 제공한다.
2. 4. 2000년대
마이크로소프트는 2001년 C#와 2003년 Visual Basic .NET에 연산자 오버로딩을 추가했다.[1]스칼라는 모든 연산자를 메서드로 취급하므로 프록시를 통해 연산자 오버로딩을 허용한다.[2]
라쿠에서는 모든 연산자의 정의가 렉시컬 함수에 위임되므로 함수 정의를 사용하여 연산자를 오버로딩하거나 새로운 연산자를 추가할 수 있다.[3] 예를 들어, 날짜 객체를 "+"로 증가시키기 위해 라쿠도 소스에서 정의된 함수는 다음과 같다.[3]
```perl6
multi infix:<+>(Date:D $d, Int:D $x) {
Date.new-from-daycount($d.daycount + $x)
}
```
"multi"가 사용되었으므로, 함수는 멀티디스패치 후보 목록에 추가되고, "+"는 함수 시그니처의 타입 제약 조건이 충족되는 경우에만 오버로딩된다.[3] 오버로딩 기능은 '''+''', '''*''', '''>=''', 후위 및 용어 '''i''' 등을 포함하지만, "'''['''x, y''']'''", "x'''['''y''']'''", "x'''{''y''}'''", 및 "x'''('''y''')'''"과 같은 다양한 중괄호 연산자도 오버로딩할 수 있다.[3]
코틀린은 생성 이후부터 연산자 오버로딩을 지원해왔다.[4]
3. 장점 및 활용
연산자 오버로딩은 사용자가 직접 만든 자료형(클래스 등)에 대해 연산자(+, -, *, / 등)를 사용할 때 어떤 동작을 할지 정의하는 기능이다. 이를 통해 코드의 가독성과 직관성을 높일 수 있다.[1]
예를 들어, 과학 계산 분야에서는 수학 공식을 코드에 직접 표현할 수 있게 되어 편리하다. 행렬 연산에서 `a + b * c` 와 같이 직관적인 표현이 가능해진다. (일반적으로 곱셈(*) 연산자가 덧셈(+) 연산자보다 우선순위가 높다고 가정한다.) 이는 `Add(a, Multiply(b, c))` 와 같이 함수를 사용하는 것보다 훨씬 간결하고 이해하기 쉽다.
과거에는 FORTRAN에서 도입된 기능으로, 처음에는 가독성과 기술성의 관점에서 여러 언어에 채택되었다. Smalltalk과 C++에 의한 객체 지향의 발달과 함께 다형성을 실현하기 위한 기능으로서의 측면도 갖게 되었다. 사용자 정의 연산자는 함수, 멤버 함수 또는 메서드 중 하나로 정의한다.
Smalltalk 예시:
```smalltalk
Object
subclass: #Value
instanceVariableNames: 'value'
classVariableNames: ''
poolDictionaries: ''
category: 'Example'.
Value
createGetMethod: 'value' default: 0;
createSetMethod: 'value'.
Value methodsFor: 'accessing'
!
species
" 연산자의 반환값 유형으로 Value 자체를 사용. "
^ Value.
!!
" '+' 연산자와 '-' 연산자 정의. "
Value methodsFor: 'operator'
!
+ aNumber
^ self species with: self value + aNumber.
!
- aNumber
^ self species with: self value - aNumber.
!!
Value methodsFor: 'instance creation'
!
with: aNumber
^ super new value: aNumber.
!!
| value0 value1 value2 |
value1 := Value with: 10.
value2 := Value with: 5.
" 사용자 정의 연산자를 사용했으므로 각 변수에는 정수 객체가 아닌 Value 클래스의 객체가 할당되어 있음. "
value0 := value1 + value2.
value0 := value1 - value2.
```
Smalltalk에서는 메서드에 기호로만 구성된 셀렉터[53]를 붙여 사용자 정의 연산자를 정의할 수 있다. Smalltalk에서 연산자는 2항 셀렉터라고 부르며 `with:` 등 영숫자로 된 셀렉터와 거의 동일하게 취급한다. Smalltalk에서 연산자는 메시지의 일종으로 취급되며, 인수가 반드시 1개이고 우선순위가 다르다는 점을 제외하면 특별 취급하지 않는다. 따라서 연산자로 정의할 수 있는 기호에는 거의 제한이 없다(단, 구분용 기호나 대입 기호는 지정할 수 없다). `->`나 `~=`와 같은 두 글자 연산자도 정의 가능하다. Smalltalk는 중복 정의가 불가능하므로, 하나의 클래스에 같은 연산자를 여러 개 정의할 수 없다. 그러나 인스턴스 객체와 클래스 객체는 같은 클래스에 묶이지만 다른 객체이므로, 인스턴스 메서드와 클래스 메서드에서 같은 연산자를 정의하는 것은 가능하다.
C++는 다중 정의가 가능한 언어이며, 사용자 정의 연산자는 다중 정의의 틀 안에 있다. 따라서 Smalltalk와 달리, 인수가 다른 경우에 한해 같은 네임스페이스에서 같은 이름의 연산자를 여러 개 정의할 수 있다. 그러나 기존 연산자를 덮어쓰게 되므로, 숫자형만 인수로 하는 연산자 정의는 불가능하다.
C++ 연산자 오버로딩 예시:
연산자 선언 | 명칭 | 동작 | 응용 예 |
---|---|---|---|
`operator Type()` | 형 변환(캐스트) 연산자 | Type 형을 반환한다. Type 형으로의 묵시적 변환이 가능해진다. 호출에는 `static_cast` 등 캐스트 구문에 의한 명시적 형 변환도 사용할 수 있다. C++11 이후에는 묵시적 형 변환을 억제하고 명시적 형 변환을 강제하는 `explicit` 수식어를 지정할 수도 있다[54]。 if문이나 while문의 조건식 등에서 사용하는 `bool` 형 변환 연산자 정의, 원자 변수의 클래스 템플릿의 내부형으로의 묵시적 변환 등에 사용된다[55]。 | |
`Type operator->()` | 화살표 연산자 | Type 형을 반환한다. 통상, 포인터형 `Type*`를 반환하고, `Type`의 멤버를 사용할 수 있도록 구현함으로써, 의사적인 포인터형을 정의할 수 있다. 스마트 포인터 등에 사용된다. |
3. 1. 구문 설탕
연산자 오버로딩은 구문 설탕이며, 대상 도메인[1]에 더 가까운 표기법을 사용하여 프로그래밍할 수 있고, 사용자가 정의한 자료형(타입)에 언어에 내장된 자료형(타입)과 유사한 수준의 구문 지원을 제공하기 때문에 사용된다. 예를 들어, 과학 컴퓨팅에서 흔히 사용되는데, 수학적 객체의 컴퓨팅 표현을 종이에 적힌 것과 동일한 구문으로 조작할 수 있게 해준다.연산자 오버로딩은 함수를 사용하여 에뮬레이션할 수 있으므로 언어의 표현력을 변경하지 않는다. 예를 들어, 행렬과 같은 사용자가 정의한 자료형(타입) 변수 a, b, c를 고려해 보자.
`a + b * c`
연산자 오버로딩을 지원하는 언어에서 '*' 연산자가 '+' 연산자보다 높은 우선순위를 갖는다는 일반적인 가정하에 이는 다음과 같이 작성하는 간결한 방법이다.
`Add(a, Multiply(b, c))`
그러나 전자의 구문은 일반적인 수학적 사용법을 반영한다.
3. 2. 예시 (C++)
C++에서 사용자 정의 자료형 `Time`에 대한 덧셈 연산자 오버로딩 예시는 다음과 같다.```cpp
Time operator+(const Time& lhs, const Time& rhs) {
Time temp = lhs;
temp.seconds += rhs.seconds;
if (temp.seconds >= 60) {
temp.seconds -= 60;
temp.minutes++;
}
temp.minutes += rhs.minutes;
if (temp.minutes >= 60) {
temp.minutes -= 60;
temp.hours++;
}
temp.hours += rhs.hours;
return temp;
}
```
덧셈은 왼쪽과 오른쪽 피연산자를 가지는 이항 연산이다. C++에서 전달되는 인자는 피연산자이며, 임시 객체가 반환 값이다.
연산자는 클래스 메서드로 정의할 수도 있는데, 이때 숨겨진 `this` 인수로 `lhs`를 대체한다. 그러나 이렇게 하면 왼쪽 피연산자가 `Time` 형식이 되어야 한다.
```cpp
Time Time::operator+(const Time& rhs) const {
Time temp = *this; // 'this' 값 복사, 이것은 수정되지 않는다.
temp.seconds += rhs.seconds;
if (temp.seconds >= 60) {
temp.seconds -= 60;
temp.minutes++;
}
temp.minutes += rhs.minutes;
if (temp.minutes >= 60) {
temp.minutes -= 60;
temp.hours++;
}
temp.hours += rhs.hours;
return temp;
}
```
`this`에서 작동되는 클래스 메서드로 정의된 단항 연산자는 명시적인 인수를 받지 않는다.
```cpp
bool Time::operator!() const {
return ((hours == 0) && (minutes == 0) && (seconds == 0));
}
4. 비판 및 주의사항
연산자 오버로딩은 프로그래머가 연산자에 본래 의미와 전혀 다른 의미를 부여할 수 있어 비판받기도 한다.[2] 예를 들어 C++에서 `<<` 연산자는, `a << 1`처럼 사용될 때 `a`가 정수형이면 비트를 왼쪽으로 1만큼 이동시키지만, `a`가 출력 스트림이면 "1"을 출력한다.
함수에도 오버로딩이 적용될 수 있다는 반론도 있다. 오버로딩이 없어도 프로그래머는 함수 이름으로 예상되는 동작과 전혀 다른 함수를 정의할 수 있다. C++처럼 연산자 기호가 제한된 언어에서는 새 작업에 더 적합한 연산자 기호를 선택할 수 없다는 문제도 있다.[2]
연산자 오버로딩은 신중하게 사용해야 하며, 자바에서는 이 기능을 채택하지 않았다.[3]
4. 1. 교환 법칙 및 결합 법칙
연산자 오버로딩은 수학에서 특정 규칙이 잘못 예상되거나 실수로 간주될 수 있다는 미묘한 문제를 야기한다. 예를 들어, + 연산자의 교환 법칙(즉, `a + b == b + a`)은 항상 적용되지 않을 수 있다. 피연산자가 문자열인 경우, + 연산자는 일반적으로 문자열 연결을 수행하도록 오버로딩되기 때문에 교환 법칙이 성립하지 않는다. 예를 들어, `"school" + "bag"`은 `"schoolbag"`을, `"bag" + "school"`은 `"bagschool"`을 생성한다.[2]수학에서 + 연산자는 정수 및 실수에서 교환 법칙이 성립하지만, 다른 유형의 변수에서는 성립하지 않을 수 있다. 또한, 부동소수점 연산에서는 반올림 오차로 인해 + 연산자의 결합 법칙((`a + b) + c == a + (b + c)`)이 성립하지 않을 수 있다.[2]
또 다른 예로, * (곱셈) 연산자는 정수에 대해서는 교환 법칙이 성립하지만, 행렬 곱셈에서는 교환 법칙이 성립하지 않는다.[2]
5. 지원 언어
프로그래밍 언어에 따라 연산자 오버로딩 지원 여부가 다르다. C, 자바 등은 연산자 오버로딩을 지원하지 않지만, C++, C#, 파이썬 등은 지원한다. 일부 언어는 새로운 연산자를 정의하는 기능을 제공하기도 하는데, ALGOL 68, 하스켈 등이 이에 해당한다.
5. 1. 분류
몇 가지 일반적인 프로그래밍 언어는 프로그래머가 연산자를 오버로딩할 수 있는지 여부와 연산자가 미리 정의된 집합으로 제한되는지에 따라 분류할 수 있다.연산자 | 오버로딩 불가능 | 오버로딩 가능 |
---|---|---|
신규 정의 | ||
제한된 집합 |
6. 객체 지향과 사용자 정의 연산자
과거에는 FORTRAN에서 도입된 기능이다. 처음에는 가독성과 기술성의 관점에서 여러 언어에 채택되었지만, Smalltalk과 C++에 의한 객체 지향의 발달과 함께 다형성을 실현하기 위한 기능으로서의 측면도 갖게 되었다. 사용자 정의 연산자의 정의는 어떤 언어에서도 함수, 멤버 함수 또는 메서드 중 하나로 정의하도록 되어 있다.
몇몇 객체 지향 언어에서는 FORTRAN과 동일한 가독성과 기술성을 고려하여 도입되었지만, 많은 객체 지향 언어에서는 수치형과 객체를 동일한 함수(또는 메서드)로 처리하는 관점에서 도입되었으며, 이러한 언어에서는 필수적인 기능이 되었다.
순수한 객체 지향 언어(특히 Smalltalk)에서 객체에 대한 연산은 모두 메서드로 수신 가능한 메시지로 표현되어야 하며, 선택자가 기호인 셈인 연산자는 특별 취급해서는 안 된다. 따라서 우선순위의 차이는 있지만, 연산자는 단순한 선택자의 일종으로 간주된다.
7. C++에서의 추가적인 연산자 오버로딩
C++에서는 `operator` 키워드를 사용하여 특수한 함수를 정의함으로써 연산자를 오버로딩할 수 있다. C++는 언어에서 제공하는 연산자만 정의할 수 있으며, 고유한 기호를 사용한 연산자는 정의할 수 없다. 연산자의 인수 및 반환값 유형에는 제한이 있다. 예를 들어, `->` 연산자는 단항 연산자로 정의하거나 숫자형 또는 `->` 연산자를 정의하지 않은 형식을 반환값 형식으로 지정할 수 없다.
C++는 다중 정의를 지원하므로, 인수가 다른 경우 같은 이름의 연산자를 여러 개 정의할 수 있다. 그러나 기존 연산자를 덮어쓰게 되므로 숫자형만 인수로 하는 연산자 정의는 불가능하다.
Smalltalk에서는 2항 연산자만 정의할 수 있지만, C++에서는 `+x`, `-x`와 같은 단항 연산자, `x[i]`와 같은 첨자 연산자, `x( a, b, c )`와 같은 함수 호출 연산자 등도 정의할 수 있다.
C++에서는 형 변환 연산자와 화살표 연산자를 포함한 다양한 연산자들을 오버로딩할 수 있다.
다음은 C++ 코드 예시이다.
```c++
class Value
{
int value;
public:
Value( int value ):
value( value )
{
}
// '+' 연산자 정의.
Value operator + ( Value const &source ) const
{
return Value( source.value + value );
}
// '-' 연산자 정의.
Value operator - ( Value const &source ) const
{
return Value( source.value - value );
}
// 단항 연산자 버전의 '-' 연산자 정의.
Value operator - (void) const
{
return Value( -value );
}
};
// 전역 함수 버전 연산자 정의.
Value operator + ( int left, Value const &right )
{
return Value( left ) + right;
}
Value operator - ( int left, Value const &right )
{
return Value( left ) - right;
}
int main(void)
{
Value
value0( 0 ),
value1( 10 ),
value2( 5 );
// 사용자 정의 연산자를 사용하고 있으므로 어떤 변수도 숫자형이 아닌 Value형이 됨.
value0 = value1 + value2;
value0 = value1 - value2;
// 멤버 함수에서는 1항목은 Value형이어야 하지만 전역 함수를 정의하고 있으므로 1항목에 숫자를 지정할 수 있음.
value0 = 10 + value2;
value0 = 10 - value2;
return EXIT_SUCCESS;
}
7. 1. 형 변환 연산자
`operator Type()` 형태를 사용하여 특정 자료형으로의 형 변환을 정의할 수 있다. C++11 이후에는 `explicit` 키워드를 사용하여 명시적 형 변환만 허용하도록 제한할 수 있다.[54]연산자 선언 | 명칭 | 동작 | 응용 예 |
---|---|---|---|
`operator Type()` | 형 변환(캐스트) 연산자 | Type 형을 반환한다. Type 형으로의 묵시적 변환이 가능하게 된다. 호출에는 `static_cast` 등 캐스트 구문에 의한 명시적 형 변환도 사용할 수 있다. C++11 이후에는 묵시적 형 변환을 억제하고 명시적 형 변환을 강제하는 `explicit` 수식어를 지정할 수도 있다.[54] 응용 예와 같이 if문이나 while문의 조건식 등에서 사용하는 `bool` 형 변환 연산자의 정의로 사용되는 외에, 원자 변수의 클래스 템플릿의 내부형으로의 묵시적 변환 등에도 사용된다.[55] | |
`Type operator->()` | 화살표 연산자 | Type 형을 반환한다. 통상, 포인터형 `Type*`를 반환하고, `Type`의 멤버를 사용할 수 있도록 구현함으로써, 의사적인 포인터형을 정의할 수 있다. 응용 예와 같은 스마트 포인터나 배타적 등을 위해 자주 사용된다. |
7. 2. 화살표 연산자
C++에서 화살표 연산자(`->`)는 `Type operator->()` 형태로 정의한다. 이 연산자는 주로 스마트 포인터나 배타적 처리 등에 사용되며, 반환값으로 통상 포인터형 `Type*`를 사용한다. 이를 통해 `Type`의 멤버를 사용할 수 있도록 구현하여 의사적인 포인터형을 정의할 수 있다.다음은 C++ 코드 예시이다.
```c++
std::shared_ptr< std::vector
// 이하에서는 std::shared_ptr::pointer operator->() 가 호출된다.
pointer->push_back(0);
// push_back() 은 std::vector 의 멤버지만, std::shared_ptr 의 멤버는 아니다.
```
위 코드에서 `std::shared_ptr::pointer operator->()`가 호출된다. 이를 통해 `push_back()`과 같은 `std::vector`의 멤버를 `std::shared_ptr`의 멤버처럼 사용할 수 있게 된다.[53]
참조
[1]
웹사이트
Operator Overloading
https://isocpp.org/w[...]
2020-08-27
[2]
웹사이트
Issues in Overloading
http://pages.cs.wisc[...]
University of Wisconsin–Madison
[3]
웹사이트
No more operator overloading
http://www.oracle.co[...]
Oracle Corporation
[4]
문서
Completely new operators can be added.
[5]
문서
Binary functions with a symbolic name can be called infix.
[6]
웹사이트
Predicate op/3
https://www.swi-prol[...]
[7]
웹사이트
Bertrand Meyer: Basic Eiffel language mechanisms
http://se.ethz.ch/~m[...]
2021-04-07
[8]
웹사이트
Operator functions in F90
http://www.mathcs.em[...]
2021-04-07
[9]
문서
Introduced in Fortran 90.
[10]
웹사이트
3. Language Reference — Futhark 0.19.0 documentation
https://futhark.read[...]
2020-10-10
[11]
서적
Programming F# 3.0: A Comprehensive Guide for Writing Simple Code to Solve Complex Problems
https://books.google[...]
O'Reilly Media, Inc.
2012-10-09
[12]
문서
[[Type class]]es instead of overloading.
[13]
웹사이트
io guide
https://iolanguage.o[...]
2021-04-07
[14]
웹사이트
Operators
https://nim-lang.git[...]
[15]
웹사이트
Operators - R in a Nutshell, 2nd Edition [Book]
https://www.oreilly.[...]
2021-04-07
[16]
웹사이트
Creating operators
https://docs.raku.or[...]
[17]
웹사이트
Operators
https://docs.scala-l[...]
[18]
웹사이트
Seed7 Manual: Structured syntax definition
http://seed7.sourcef[...]
2020-09-29
[19]
서적
Smalltalk and Object Orientation: An Introduction
https://books.google[...]
Springer Science & Business Media
2012-12-06
[20]
웹사이트
Swift: Advanced Operators
https://docs.swift.o[...]
[21]
웹사이트
Why does Go not support overloading of methods and operators?
http://golang.org/do[...]
2011-09-04
[22]
웹사이트
Introduction
https://www.freepasc[...]
2020-09-30
[23]
웹사이트
Operator Overloads
https://github.com/M[...]
2018-09-28
[24]
웹사이트
6.6 Overloading of Operators
https://www.adaic.or[...]
[25]
서적
C# in a Nutshell
https://books.google[...]
O'Reilly Media, Inc.
[26]
웹사이트
C++ Operator Overloading
https://en.cpprefere[...]
[27]
웹사이트
Eclipse Ceylon: Operator Polymorphism
https://ceylon-lang.[...]
2021-04-07
[28]
웹사이트
Operator Overloading - D Programming Language
https://dlang.org/sp[...]
2020-10-10
[29]
웹사이트
A tour of the Dart language
https://dart.dev/gui[...]
2020-09-30
[30]
웹사이트
Operator Overloading
http://bourabai.kz/e[...]
2021-04-07
[31]
웹사이트
The Apache Groovy programming language - Operators
https://groovy-lang.[...]
2020-09-30
[32]
웹사이트
Operator overloading
https://kotlinlang.o[...]
2018-06-24
[33]
웹사이트
Metamethods Tutorial
http://lua-users.org[...]
[34]
웹사이트
Implementing Operators for Your Class
http://www.mathworks[...]
2013-10-01
[35]
웹사이트
Operator Overloading
http://www.freepasca[...]
2014-12-01
[36]
웹사이트
Operator Overloading
http://docwiki.embar[...]
2014-12-01
[37]
웹사이트
PHP magic methods overriding class properties
http://webwidetutor.[...]
2015-04-07
[38]
서적
Computer Science & Perl Programming: Best of The Perl Journal
https://books.google[...]
O'Reilly Media, Inc.
2002-11-04
[39]
웹사이트
3. Data Model
https://docs.python.[...]
[40]
웹사이트
Methods
https://www.ruby-lan[...]
[41]
웹사이트
Operator Overloading
https://doc.rust-lan[...]
[42]
웹사이트
How to: Define an Operator (Visual Basic)
https://docs.microso[...]
2021-09-15
[43]
웹사이트
Report on the Algorithmic Language ALGOL 68, Section 10.2.2.
https://www.software[...]
2007-04-01
[44]
웹사이트
A History of C++: 1979−1991
http://www.stroustru[...]
2007-04-01
[45]
웹사이트
FAQ Question 6.9: Why isn't there operator overloading?
http://www.cafeaulai[...]
[46]
웹사이트
java.sun.com
http://java.sun.com/[...]
2009-03-26
[47]
서적
C++: Black Book
Coriolis Group
[48]
웹사이트
3. Data Model, Special method names
https://docs.python.[...]
[49]
웹사이트
https://web.kudpc.ky[...]
[50]
웹사이트
http://www.rs.kagu.s[...]
[51]
웹사이트
https://msdn.microso[...]
[52]
웹사이트
https://docs.oracle.[...]
[53]
문서
메시지와 메서드를 紐づける名前。Smalltalk에서는 하나의 메서드에 여러개의 セレクター를 붙일 수 있다.
[54]
웹사이트
명시적인 형변환 연산자의 오버로딩 - cpprefjp C++일본어 레퍼런스
https://cpprefjp.git[...]
[55]
웹사이트
atomic::operator T - cpprefjp C++일본어 레퍼런스
https://cpprefjp.git[...]
[56]
웹인용
C++ FAQ Lite: What are the benefits of operator overloading?
http://www.parashift[...]
2010-08-01
[57]
문서
상징적인 이름으로 바이너리 기능 삽입을 호출할 수 있다
[58]
문서
포트란 90에서 소개
[59]
문서
오버로딩의 유형 클래스를 대신함
[60]
웹인용
Operator Overloading, Free Pascal Manual
http://www.freepasca[...]
2011-06-01
[61]
웹인용
알고리즘 언어 ALGOL 68에 대한 보고서, Section 10.2.2.
http://www.fh-jena.d[...]
2007-04-01
[62]
웹인용
C++의 역사: 1979−1991 - 페이지 12
http://www.research.[...]
2007-04-01
[63]
웹사이트
http://www.cafeaulai[...]
[64]
웹사이트
http://java.sun.com/[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com